FRP 自建内网穿透

04篇里接线员是ngrok雇的 免费版地址会变还限速;Tunnel把接线员换成了Cloudflare 但要挂自己域名、数据走人家节点。FRP是第三条路:把接线员换成自己——前提是得有台带公网IP(或至少有公网端口)的VPS

定位说明:这篇是文档学习加方案设计 FRP 我还没在自己机器上实际跑通 命令和配置都按官方文档整理 真动手时以官方仓库说明为准(全文核对点)

组成:一端一个程序

frp(Fast Reverse Proxy)就两个可执行文件:

  • frps 服务端 跑在VPS上 当"服务台"
  • frpc 客户端 跑在你内网的机器上 当"内线电话"
flowchart LR
    A["访客<br>公网上任何人"] --> B["VPS: frps<br>监听公网端口"]
    B -. "frpc 主动拨出的<br>长连接隧道" .-> C["内网电脑: frpc"]
    C --> D["本地服务<br>SSH 22 / 网站 8080 / 远程桌面 3389"]

关键在虚线那一步:frpc 是主动去连 frps 的 所以你内网的机器只要能上网就行 不需要公网IP——隧道建起来之后 访客敲VPS的端口 frps顺着隧道把流量递给frpc frpc转交本地服务 和ngrok原理一模一样 只是中间那台服务器从别人家换成了自己家

服务端配置(VPS上)

github.com/fatedier/frp releases 下载对应系统版本 解压出 frps

frps.toml 最小配置:

bindPort = 7000
auth.token = "换成一段只有你知道的随机字符串"

跑起来:

./frps -c frps.toml

安全组/防火墙记得放行 7000 以及后面客户端要用的 remotePort。长期挂建议交给 systemd 或者 docker(VPS上docker那条路见VPS Docker 部署完整指南

客户端配置(内网机器上)

frpc.toml

serverAddr = "你VPS的公网IP"
serverPort = 7000
auth.token = "与服务端一致"

[[proxies]]
name = "my-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6022

跑起来:

./frpc -c frpc.toml

之后在任何地方 ssh -p 6022 用户名@VPS公网IP 就会落到家里那台机器的22端口 上门服务变成"敲VPS的门 VPS帮我转进去"

网站同理:localPort 改成 8080 有两种玩法——

  • 简单粗暴:type 保持 tcp remotePort=8080 直接访问 IP:8080 什么协议都透传
  • 讲究点:type 改 http 配 customDomains 需要把域名解析到VPS 由frps按域名分流(配合DNS那套 见DNS 记录与域名实战

NAT VPS 能不能当 frps

我的VPS是NAT型(NAT VPS那篇记过)——没有独立公网IP 只有商家映射好的一段共享端口 这种机器想当frps:

  • bindPort 必须落在商家给你的可用端口段内
  • 每个remotePort也得提前在商家面板里映射好 不是想开几号就开几号

理论上可行(frp不在乎中转机是不是独立IP 只要端口能通)但我没验证过(核对点) 真要试先确认NAT VPS给了多少个TCP转发额度

版本坑:ini 和 toml

frp 从 0.52.0 起配置文件从 .ini 换成了 .toml 字段名全变了(bind_portbindPort)网上大量老教程还是ini写法 直接抄会报错——看教程先看它按哪个版本写的 下载程序时也尽量和教程对版本

和另外两条路怎么选

一句话版:偶尔调试选ngrok 长期网站选Tunnel 有VPS想全权掌控选FRP——完整对比表见06-内网穿透选型对比


⬅️ 内网穿透 ngork 🏠 00-网络与项目 ➡️ 内网穿透选型对比